{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "68e439b4",
   "metadata": {},
   "source": [
    "## 设置读取/保存路径"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "054e11cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 原街景图的路径\n",
    "original_path = r'E:\\lunwenzhibiaoshuju\\daima\\zhifuqu'\n",
    "# 拼接街景图的路径\n",
    "joint_path = r'E:\\lunwenzhibiaoshuju\\daima\\zhifuqupinjie'"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c98a40e6",
   "metadata": {},
   "source": [
    "## 获取文件下所有图像命名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "edde0960",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['0_0.jpg', '0_1.jpg', '0_2.jpg', '0_3.jpg', '10_0.jpg', '10_1.jpg', '10_2.jpg', '10_3.jpg', '11_0.jpg', '11_1.jpg', '11_2.jpg', '11_3.jpg', '12_0.jpg', '12_1.jpg', '12_2.jpg', '12_3.jpg', '13_0.jpg', '13_1.jpg', '13_2.jpg', '13_3.jpg', '14_0.jpg', '14_1.jpg', '14_2.jpg', '14_3.jpg', '15_0.jpg', '15_1.jpg', '15_2.jpg', '15_3.jpg', '16_0.jpg', '16_1.jpg', '16_2.jpg', '16_3.jpg', '17_0.jpg', '17_1.jpg', '17_2.jpg', '17_3.jpg', '18_0.jpg', '18_1.jpg', '18_2.jpg', '18_3.jpg', '19_0.jpg', '19_1.jpg', '19_2.jpg', '19_3.jpg', '1_0.jpg', '1_1.jpg', '1_2.jpg', '1_3.jpg', '20_0.jpg', '20_1.jpg', '20_2.jpg', '20_3.jpg', '21_0.jpg', '21_1.jpg', '21_2.jpg', '21_3.jpg', '22_0.jpg', '22_1.jpg', '22_2.jpg', '22_3.jpg', '23_0.jpg', '23_1.jpg', '23_2.jpg', '23_3.jpg', '24_0.jpg', '24_1.jpg', '24_2.jpg', '24_3.jpg', '25_0.jpg', '25_1.jpg', '25_2.jpg', '25_3.jpg', '26_0.jpg', '26_1.jpg', '26_2.jpg', '26_3.jpg', '27_0.jpg', '27_1.jpg', '27_2.jpg', '27_3.jpg', '28_0.jpg', '28_1.jpg', '28_2.jpg', '28_3.jpg', '29_0.jpg', '29_1.jpg', '29_2.jpg', '29_3.jpg', '2_0.jpg', '2_1.jpg', '2_2.jpg', '2_3.jpg', '30_0.jpg', '30_1.jpg', '30_2.jpg', '30_3.jpg', '3_0.jpg', '3_1.jpg', '3_2.jpg', '3_3.jpg', '4_0.jpg', '4_1.jpg', '4_2.jpg', '4_3.jpg', '5_0.jpg', '5_1.jpg', '5_2.jpg', '5_3.jpg', '6_0.jpg', '6_1.jpg', '6_2.jpg', '6_3.jpg', '7_0.jpg', '7_1.jpg', '7_2.jpg', '7_3.jpg', '8_0.jpg', '8_1.jpg', '8_2.jpg', '8_3.jpg', '9_0.jpg', '9_1.jpg', '9_2.jpg', '9_3.jpg']\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "name_list = []\n",
    "\n",
    "for fn in os.listdir(original_path):\n",
    "    if fn.split('.')[1] == 'jpg':\n",
    "        name_list.append(fn)\n",
    "print(name_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e690e82",
   "metadata": {},
   "source": [
    "## 循环列表, 每次取4个"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "85c332e0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['0_0.jpg', '0_1.jpg', '0_2.jpg', '0_3.jpg']\n",
      "['10_0.jpg', '10_1.jpg', '10_2.jpg', '10_3.jpg']\n",
      "['11_0.jpg', '11_1.jpg', '11_2.jpg', '11_3.jpg']\n",
      "['12_0.jpg', '12_1.jpg', '12_2.jpg', '12_3.jpg']\n",
      "['13_0.jpg', '13_1.jpg', '13_2.jpg', '13_3.jpg']\n",
      "['14_0.jpg', '14_1.jpg', '14_2.jpg', '14_3.jpg']\n",
      "['15_0.jpg', '15_1.jpg', '15_2.jpg', '15_3.jpg']\n",
      "['16_0.jpg', '16_1.jpg', '16_2.jpg', '16_3.jpg']\n",
      "['17_0.jpg', '17_1.jpg', '17_2.jpg', '17_3.jpg']\n",
      "['18_0.jpg', '18_1.jpg', '18_2.jpg', '18_3.jpg']\n",
      "['19_0.jpg', '19_1.jpg', '19_2.jpg', '19_3.jpg']\n",
      "['1_0.jpg', '1_1.jpg', '1_2.jpg', '1_3.jpg']\n",
      "['20_0.jpg', '20_1.jpg', '20_2.jpg', '20_3.jpg']\n",
      "['21_0.jpg', '21_1.jpg', '21_2.jpg', '21_3.jpg']\n",
      "['22_0.jpg', '22_1.jpg', '22_2.jpg', '22_3.jpg']\n",
      "['23_0.jpg', '23_1.jpg', '23_2.jpg', '23_3.jpg']\n",
      "['24_0.jpg', '24_1.jpg', '24_2.jpg', '24_3.jpg']\n",
      "['25_0.jpg', '25_1.jpg', '25_2.jpg', '25_3.jpg']\n",
      "['26_0.jpg', '26_1.jpg', '26_2.jpg', '26_3.jpg']\n",
      "['27_0.jpg', '27_1.jpg', '27_2.jpg', '27_3.jpg']\n",
      "['28_0.jpg', '28_1.jpg', '28_2.jpg', '28_3.jpg']\n",
      "['29_0.jpg', '29_1.jpg', '29_2.jpg', '29_3.jpg']\n",
      "['2_0.jpg', '2_1.jpg', '2_2.jpg', '2_3.jpg']\n",
      "['30_0.jpg', '30_1.jpg', '30_2.jpg', '30_3.jpg']\n",
      "['3_0.jpg', '3_1.jpg', '3_2.jpg', '3_3.jpg']\n",
      "['4_0.jpg', '4_1.jpg', '4_2.jpg', '4_3.jpg']\n",
      "['5_0.jpg', '5_1.jpg', '5_2.jpg', '5_3.jpg']\n",
      "['6_0.jpg', '6_1.jpg', '6_2.jpg', '6_3.jpg']\n",
      "['7_0.jpg', '7_1.jpg', '7_2.jpg', '7_3.jpg']\n",
      "['8_0.jpg', '8_1.jpg', '8_2.jpg', '8_3.jpg']\n",
      "['9_0.jpg', '9_1.jpg', '9_2.jpg', '9_3.jpg']\n"
     ]
    }
   ],
   "source": [
    "from PIL import Image\n",
    "\n",
    "for images in [name_list[i:i + 4] for i in range(0, len(name_list), 4)]:\n",
    "    # print(images)\n",
    "    # 对4个图片的顺序进行排序, 影响最后的拼接效果\n",
    "    #images = [images[0], images[3], images[1], images[2]]\n",
    "    print(images)\n",
    "    # 打开第一张\n",
    "    images1 = images[0]\n",
    "    image1_open = Image.open(original_path + '/' + images1)\n",
    "    # 获取图像尺寸\n",
    "    width, height = image1_open.size\n",
    "    # 创建空白长图\n",
    "    white = Image.new(image1_open.mode, (width * 4, height))\n",
    "    # 依次打开图像, 进行拼接\n",
    "    for j, image in enumerate(images):\n",
    "        image_open = Image.open(original_path + '/' + image)\n",
    "        # 拼接图像\n",
    "        white.paste(image_open, box=(j * width, 0))\n",
    "    white.save(joint_path + '/' + images1.split('_')[0] + '.jpg', quality=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a5f0c9f",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
